前面花了不少篇幅介紹關於 Connection ID 的議題,今天要來說明 Connection ID 真正的用處 - Connection Migration
在以前 TCP 時期一條 TCP 連線是由 (Source IP
, Source port
, Destination IP
, Destination Port
) 組成,只要其中一個元素改變,就必須要重啟一條新的連線。
在現代行動裝置盛行的生活環境,IP 位置可能經常會發生變化,走進一個 Wi-Fi 覆蓋範圍,離開那個範圍都會使手機端的 IP 發生變動。如果是走 TCP 協定的應用程式在這種情況就會頻繁的建立新連線,對用戶的體驗極度不適。
QUIC 針對這個問題提出的解決方案就是 Connection Migration,不再透過四元組識別使用者,而是利用 Connection ID 來識別,避免更改 IP 就會重啟連線。
這個特性我認為是 0-RTT 連線之後 QUIC 的另一大特色,也符合 QUIC 建立的精神,快,讓用戶的使用體驗提昇。
Connection Migration 是一個強大的武器,藉由 Connection ID 可以使 QUIC 不看四元組的情況下識別 Client 的身份,在介紹 Connection Migration 之前需要先討論一些禁止事項。
在 Handshake 流程還沒有完成以前,是不能觸發 Connection Migration 機制的,如果建立連線的過程中傳輸了 disable_active_migration
參數,傳送該參數的一端在後續發送封包時不得使用新的 address,
Connection Migration 是非常強大的機制,但因為牽扯到狀態管理,所以基本流程外,每間大公司實作的機制都會有些許差異,後續幾天的介紹主要會講解 RFC9000 中簡述的流程,實際上整個流程有很多彈性調整空間,可以根據使用場景不同進行客製化。